package com.hy.frame.util;

import android.annotation.TargetApi;
import android.os.Build;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;

/**
 * title 时间工具
 * author HeYan
 * time 19-7-8 下午5:45
 * desc 无
 */
public final class DateUtil {
    /**
     * 获取当前时间Date "yyyy-MM-dd HH:mm:ss"
     *
     * @return 现在时间(Now)
     */
    public static String getNowDateStr() {
        return getNowDateStr("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取当前时间Date "yyyy-MM-dd HH:mm:ss"
     *
     * @param type 指定格式
     * @return 现在时间(Now)
     */
    public static String getNowDateStr(String type) {
        return getDateStr(System.currentTimeMillis(), type);
    }

    /**
     * 获取当前时间Date
     *
     * @param date 时间
     * @param type 时间格式 "yyyy-MM-dd HH:mm:ss"
     * @return 字符串时间
     */
    @TargetApi(Build.VERSION_CODES.O)
    public static String getDateStr(LocalDateTime date, String type) {
        if (date == null) return "";
        String pattern = type == null ? "yyyy-MM-dd HH:mm:ss" : type;
        DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
        return date.format(df);
    }

    /**
     * 获取当前时间Date
     *
     * @param date 时间
     * @param type 时间格式 "yyyy-MM-dd HH:mm:ss"
     * @return 字符串时间
     */
    public static String getDateStr(Date date, String type) {
        if (date == null) return "";
        String pattern = type == null ? "yyyy-MM-dd HH:mm:ss" : type;
        SimpleDateFormat df = new SimpleDateFormat(pattern, Locale.CHINA);
        return df.format(date);
    }

    /**
     * 获取当前时间Date
     *
     * @param time 时间戳 可以是十位数
     * @param type 时间格式 "yyyy-MM-dd HH:mm:ss"
     * @return 字符串时间
     */
    public static String getDateStr(long time, String type) {
        long t = time < 100 * 10000 * 10000L ? time * 1000L : time;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            return getDateStr(timestampToLocalDateTime(t), type);
        }
        return getDateStr(new Date(t), type);
    }

    /**
     * 字符串时间转Date
     *
     * @param date 字符串时间
     * @param type 时间格式 "yyyy-MM-dd HH:mm:ss"
     * @return Date
     */
    public static Date strToDate(String date, String type) {
        if (date == null) return null;
        String pattern = type == null ? "yyyy-MM-dd HH:mm:ss" : type;
        try {
            DateFormat df = new SimpleDateFormat(pattern, Locale.CHINA);
            return df.parse(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 字符串时间转毫秒时间戳
     *
     * @param date 字符串时间
     * @param type 时间格式 "yyyy-MM-dd HH:mm:ss"
     * @return 时间戳
     */
    public static long strToTimestamp(String date, String type) {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            return localDateTimeToTimestamp(strToLocalDateTime(date, type));
        }
        return strToDate(date, type).getTime();
    }

    /**
     * 字符串时间转LocalDateTime
     *
     * @param date 字符串时间
     * @param type 时间格式 "yyyy-MM-dd HH:mm:ss"
     * @return LocalDateTime
     */
    @TargetApi(Build.VERSION_CODES.O)
    public static LocalDateTime strToLocalDateTime(String date, String type) {
        if (date == null) return null;
        String pattern = type == null ? "yyyy-MM-dd HH:mm:ss" : type;
        try {
            DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
            return LocalDateTime.parse(date, df);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * LocalDateTime转毫秒时间戳
     *
     * @param localDateTime LocalDateTime
     * @return 时间戳
     */
    @TargetApi(Build.VERSION_CODES.O)
    public static long localDateTimeToTimestamp(LocalDateTime localDateTime) {
        try {
            ZoneId zoneId = ZoneId.systemDefault();
            Instant instant = localDateTime.atZone(zoneId).toInstant();
            return instant.toEpochMilli();
        } catch (Exception ignored) {
        }
        return 0;
    }

    /**
     * 时间戳转LocalDateTime
     *
     * @param timestamp 时间戳
     * @return LocalDateTime
     */
    @TargetApi(Build.VERSION_CODES.O)
    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        try {
            Instant instant = Instant.ofEpochMilli(timestamp);
            ZoneId zone = ZoneId.systemDefault();
            return LocalDateTime.ofInstant(instant, zone);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


}
